package com.splider.sdk;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import java.util.HashSet;
import java.util.Set;

/**
 *
 *
 * 项目名称：splider
 * 类名称：HtmlParseTool
 * 类描述： 队列，保存要访问的url
 * 创建人：qd
 * 创建时间：2020.07.06
 *
 */
public class HtmlParseTool {

    public static Set<String> extracLinks(String url, LinkFilter filter) {
        Set<String > links=new HashSet<String>();
        try {
            Parser parser =new Parser(url);
            parser.setEncoding("UTF-8");
            //过滤<frame> 标签的filtr,用来提取frame标签里的src属性
            @SuppressWarnings("serial")
            NodeFilter frameFilter=new NodeFilter() {
                @Override
                public boolean accept(Node node) {
                    if (node.getText().startsWith("frame src=")) {
                        return true;
                    }
                    return false;
                }
            };
            //OfFilter来设置过滤<a>标签和<frame>标签
            OrFilter linkFilter=new OrFilter(new NodeClassFilter(LinkTag.class),frameFilter);
            //得到所有经过过滤的标签
            NodeList list=parser.extractAllNodesThatMatch(linkFilter);
            for (int i = 0; i < list.size(); i++) {
                Node tag=list.elementAt(i);
                if (tag instanceof LinkTag) { //<a> 标签
                    LinkTag link=(LinkTag) tag;
                    String linkUrl=link.getLink(); //URL
                    if (filter.accept(linkUrl))
                        links.add(linkUrl);
                }else {
                    //提取Frame里面的SRC属性的连接，<frame src="text.html">
                    String frame=tag.getText();
                    int start=frame.indexOf("src=");
                    frame=frame.substring(start);
                    int end =frame.indexOf(" ");
                    if (end ==-1) {
                        end=frame.indexOf(">");
                        String frameUrl=frame.substring(5,end-1);
                        if (filter.accept(frameUrl)) {
                            links.add(frameUrl);
                        }
                    }
                }
            }

        } catch (ParserException e) {
            e.printStackTrace();
        }
        return links;
    }
}
